package com.xp.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.xp.entity.FlowDefinition;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
import org.apache.ibatis.annotations.Update;

import java.time.LocalDateTime;
import java.util.List;

/**
 * 流程定义数据访问接口
 * 
 * @author xp
 * @since 2025-01-01
 */
@Mapper
public interface FlowDefinitionMapper extends BaseMapper<FlowDefinition> {

    /**
     * 根据流程编码查询流程定义
     * 
     * @param flowCode 流程编码
     * @return 流程定义信息
     */
    @Select("SELECT * FROM flow_definition WHERE flow_code = #{flowCode} AND deleted = 0")
    FlowDefinition selectByFlowCode(@Param("flowCode") String flowCode);

    /**
     * 根据流程编码和版本查询流程定义
     * 
     * @param flowCode 流程编码
     * @param version 版本号
     * @return 流程定义信息
     */
    @Select("SELECT * FROM flow_definition WHERE flow_code = #{flowCode} AND version = #{version} AND deleted = 0")
    FlowDefinition selectByFlowCodeAndVersion(@Param("flowCode") String flowCode, @Param("version") String version);

    /**
     * 根据流程名称查询流程定义
     * 
     * @param flowName 流程名称
     * @return 流程定义信息
     */
    @Select("SELECT * FROM flow_definition WHERE flow_name = #{flowName} AND deleted = 0")
    FlowDefinition selectByFlowName(@Param("flowName") String flowName);

    /**
     * 分页查询流程定义列表
     * 
     * @param page 分页参数
     * @param flowCode 流程编码（可选，模糊查询）
     * @param flowName 流程名称（可选，模糊查询）
     * @param category 流程分类（可选）
     * @param statusList 状态列表（可选）
     * @param version 版本号（可选）
     * @param applicationName 应用名称（可选）
     * @param creatorId 创建者ID（可选）
     * @param createTimeStart 创建时间开始（可选）
     * @param createTimeEnd 创建时间结束（可选）
     * @param sortField 排序字段（可选）
     * @param sortOrder 排序方向（可选）
     * @return 流程定义分页列表
     */
    IPage<FlowDefinition> selectFlowDefinitionPage(Page<FlowDefinition> page, 
                                                  @Param("flowCode") String flowCode,
                                                  @Param("flowName") String flowName,
                                                  @Param("category") String category,
                                                  @Param("statusList") List<Integer> statusList,
                                                  @Param("version") String version,
                                                  @Param("applicationName") String applicationName,
                                                  @Param("creatorId") Long creatorId,
                                                  @Param("createTimeStart") LocalDateTime createTimeStart,
                                                  @Param("createTimeEnd") LocalDateTime createTimeEnd,
                                                  @Param("sortField") String sortField,
                                                  @Param("sortOrder") String sortOrder);

    /**
     * 查询所有已发布的流程定义
     * 
     * @return 流程定义列表
     */
    @Select("SELECT * FROM flow_definition WHERE status = 1 AND deleted = 0 ORDER BY create_time DESC")
    List<FlowDefinition> selectPublishedFlows();

    /**
     * 查询所有启用的流程定义
     * 
     * @return 流程定义列表
     */
    @Select("SELECT * FROM flow_definition WHERE status = 1 AND deleted = 0 ORDER BY create_time DESC")
    List<FlowDefinition> selectEnabledFlowDefinitions();

    /**
     * 根据分类查询流程定义
     * 
     * @param category 流程分类
     * @return 流程定义列表
     */
    @Select("SELECT * FROM flow_definition WHERE category = #{category} AND deleted = 0 ORDER BY create_time DESC")
    List<FlowDefinition> selectByCategory(@Param("category") String category);

    /**
     * 根据创建人ID查询流程定义
     * 
     * @param creatorId 创建人ID
     * @return 流程定义列表
     */
    @Select("SELECT * FROM flow_definition WHERE creator_id = #{creatorId} AND deleted = 0 ORDER BY create_time DESC")
    List<FlowDefinition> selectByCreatorId(@Param("creatorId") Long creatorId);

    /**
     * 更新流程状态
     * 
     * @param id 流程ID
     * @param status 新状态
     * @return 更新行数
     */
    @Update("UPDATE flow_definition SET status = #{status}, update_time = NOW() WHERE id = #{id}")
    int updateStatus(@Param("id") Long id, @Param("status") Integer status);

    /**
     * 更新流程状态（带备注）
     * 
     * @param id 流程ID
     * @param status 新状态
     * @param remark 备注
     * @return 更新行数
     */
    @Update("UPDATE flow_definition SET status = #{status}, remark = #{remark}, update_time = NOW() WHERE id = #{id}")
    int updateStatus(@Param("id") Long id, @Param("status") Integer status, @Param("remark") String remark);

    /**
     * 根据应用名称查询流程定义（用于LiteFlow）
     * 
     * @param applicationName 应用名称
     * @return 流程定义列表
     */
    @Select("SELECT * FROM flow_definition WHERE application_name = #{applicationName} AND status = 1 AND deleted = 0")
    List<FlowDefinition> selectByApplicationName(@Param("applicationName") String applicationName);

    /**
     * 查询流程定义的所有版本
     * 
     * @param flowCode 流程编码
     * @return 流程定义版本列表
     */
    @Select("SELECT * FROM flow_definition WHERE flow_code = #{flowCode} AND deleted = 0 ORDER BY version DESC")
    List<FlowDefinition> selectVersionsByFlowCode(@Param("flowCode") String flowCode);
}